#pragma once
#include <memory>

#define LOG_TRACE(...)      jse_log::get().get_logger()->trace(__VA_ARGS__)
#define LOG_DEBUG(...)      jse_log::get().get_logger()->debug(__VA_ARGS__)
#define LOG_INFO(...)       jse_log::get().get_logger()->info(__VA_ARGS__)
#define LOG_WARN(...)       jse_log::get().get_logger()->warn(__VA_ARGS__)
#define LOG_ERROR(...)      jse_log::get().get_logger()->error(__VA_ARGS__)
#define LOG_CRITICAL(...)   jse_log::get().get_logger()->critical(__VA_ARGS__)

namespace spdlog {
    class logger;
}

class jse_log {
private:
    static jse_log instance_;
    std::shared_ptr<spdlog::logger> console_;
    jse_log() = default;
    jse_log(const jse_log&) = delete;
    jse_log(const jse_log&&) = delete;
public:
    static jse_log& get();
    bool init();
    std::shared_ptr<spdlog::logger> get_logger() { return console_; }

};